use serde_json::Value;
use tonic::transport::Channel;

struct DynamicClient {
    channel: Channel,
}
// use tonic_reflection::client::Client as ReflectionClient;
impl DynamicClient {
    // pub async fn new(addr: &str) -> Result<Self, Box<dyn std::error::Error>> {
    //     let channel = Channel::from_static(addr)
    //         .connect()
    //         .await?;
    //     Ok(Self { channel })
    // }

    // pub async fn call(
    //     &self,
    //     service: &str,
    //     method: &str,
    //     request: Value,
    // ) -> Result<Value, Box<dyn std::error::Error>> {
    //     // 构造方法路径
    //     let path = format!("/{}/{}", service, method);
    //
    //     // 将 JSON 转换为字节
    //     let request_bytes = serde_json::to_vec(&request)?;
    //
    //     // 发送请求
    //     let response = self.channel
    //         .call(
    //             http::Request::new(request_bytes)
    //                 .uri(&path)
    //                 .method("POST"),
    //         )
    //         .await?;
    //
    //     // 解析响应
    //     let response_bytes = response.into_inner();
    //     let response_json: Value = serde_json::from_slice(&response_bytes)?;
    //
    //     Ok(response_json)
    // }
    //
    // #[tokio::main]
    // async fn main() -> Result<(), Box<dyn std::error::Error>> {
    //     let client = DynamicClient::new("http://[::1]:50051").await?;
    //
    //     // 构造请求
    //     let request = serde_json::json!({
    //     "name": "test",
    //     "value": 123
    // });
    //
    //     // 调用服务
    //     let response = client
    //         .call(
    //             "mypackage.MyService",
    //             "MyMethod",
    //             request,
    //         )
    //         .await?;
    //
    //     println!("Response: {:?}", response);
    //     Ok(())
    // }
}

//
// use tonic::{Request, transport::Channel};
// use tonic_reflection::client::Client as ReflectionClient;
//
// struct DynamicClient {
//     reflection_client: ReflectionClient<Channel>,
// }
//
// impl DynamicClient {
//     pub async fn new(addr: &str) -> Result<Self, Box<dyn std::error::Error>> {
//         let channel = Channel::from_static(addr)
//             .connect()
//             .await?;
//
//         let reflection_client = ReflectionClient::new(channel);
//
//         Ok(Self { reflection_client })
//     }
//
//     pub async fn list_services(&mut self) -> Result<(), Box<dyn std::error::Error>> {
//         let response = self.reflection_client
//             .server_reflection_info()
//             .await?;
//
//         println!("Services: {:?}", response);
//         Ok(())
//     }
// }
//
// #[tokio::main]
// async fn main() -> Result<(), Box<dyn std::error::Error>> {
//     let mut client = DynamicClient::new("http://[::1]:50051").await?;
//     client.list_services().await?;
//     Ok(())
// }